package com.blog.cmrpersonalblog.service;

import com.blog.cmrpersonalblog.common.PageResult;
import com.blog.cmrpersonalblog.dto.article.request.ArticleCommentListRequest;
import com.blog.cmrpersonalblog.dto.article.response.ArticleCommentResponse;
import com.blog.cmrpersonalblog.dto.comment.request.CommentCreateRequest;
import com.blog.cmrpersonalblog.dto.comment.request.CommentLikeRequest;
import com.blog.cmrpersonalblog.dto.comment.request.CommentTreeRequest;
import com.blog.cmrpersonalblog.dto.comment.responst.CommentLikeResponse;
import com.blog.cmrpersonalblog.dto.comment.responst.CommentStatsResponse;

import java.util.List;

/**
 * 用户端评论服务接口
 */
public interface UserCommentService {

    /**
     * 获取文章评论列表
     * @param request 查询请求
     * @return 评论列表
     */
    List<ArticleCommentResponse> getArticleComments(ArticleCommentListRequest request);


    /**
     * 获取文章评论树形结构（一次性加载，避免N+1查询）
     * @param request 查询请求
     * @return 树形评论列表
     */
    PageResult<ArticleCommentResponse> getCommentTree(CommentTreeRequest request);

    /**
     * 创建评论
     * @param request 评论创建请求
     * @param userId 当前用户ID
     * @param clientIp 客户端IP
     * @param userAgent 用户代理
     * @return 创建的评论
     */
    ArticleCommentResponse createComment(CommentCreateRequest request, Long userId, String clientIp, String userAgent);

    /**
     * 点赞/取消点赞评论
     * @param request 点赞请求
     * @param userId 当前用户ID
     * @return 操作结果
     */
    CommentLikeResponse likeComment(CommentLikeRequest request, Long userId);

    /**
     * 获取评论详情
     * @param commentId 评论ID
     * @param userId 当前用户ID（可为null）
     * @return 评论详情
     */
    ArticleCommentResponse getCommentDetail(Long commentId, Long userId);

    /**
     * 删除评论（用户只能删除自己的评论）
     * @param commentId 评论ID
     * @param userId 当前用户ID
     * @return 是否删除成功
     */
    boolean deleteComment(Long commentId, Long userId);

    /**
     * 检查用户是否可以评论指定文章
     * @param articleId 文章ID
     * @param userId 用户ID
     * @return 是否可以评论
     */
    boolean canUserComment(Long articleId, Long userId);

    /**
     * 获取评论统计信息
     * @param commentId 评论ID
     * @return 统计信息
     */
    CommentStatsResponse getCommentStats(Long commentId);
}
